রানটাইমে টাইপস্ক্রিপ্ট ভ্যালিডেশনের অপরিহার্য জগৎটি অন্বেষণ করুন। আরও নির্ভরযোগ্য এবং রক্ষণাবেক্ষণযোগ্য অ্যাপ্লিকেশন তৈরি করতে শীর্ষস্থানীয় লাইব্রেরি, সেরা অনুশীলন এবং ব্যবহারিক উদাহরণ আবিষ্কার করুন।
টাইপস্ক্রিপ্ট ভ্যালিডেশন: শক্তিশালী অ্যাপ্লিকেশনের জন্য রানটাইম টাইপ চেকিং লাইব্রেরি আয়ত্ত করা
অ্যাপ্লিকেশনগুলি জটিলতায় বাড়ার সাথে সাথে এবং বিভিন্ন বিশ্বব্যাপী ল্যান্ডস্কেপে স্থাপন করার সাথে সাথে ডেটার অখণ্ডতা নিশ্চিত করা এবং অপ্রত্যাশিত ত্রুটিগুলি প্রতিরোধ করা অত্যন্ত গুরুত্বপূর্ণ হয়ে ওঠে। যদিও টাইপস্ক্রিপ্ট কম্পাইল-টাইম টাইপ চেকিংয়ে পারদর্শী, কোড চালানোর আগেই ত্রুটিগুলি ধরা পরে, এমন পরিস্থিতি রয়েছে যেখানে রানটাইম বৈধতা অপরিহার্য। এটি বিশেষত API অনুরোধ, ব্যবহারকারীর ইনপুট বা কনফিগারেশন ফাইলের মতো বাহ্যিক ডেটা উত্সের সাথে কাজ করার সময় সত্য, যেখানে ডেটার আকার এবং প্রকারের গ্যারান্টি দেওয়া হয় না।
এই বিস্তৃত গাইডটি রানটাইমে টাইপস্ক্রিপ্ট বৈধতার গুরুত্বপূর্ণ ক্ষেত্রটিতে প্রবেশ করে। আমরা অন্বেষণ করব কেন এটি প্রয়োজনীয়, শীর্ষস্থানীয় লাইব্রেরিগুলি উপস্থাপন করব যা বিকাশকারীদের শক্তিশালী বৈধতা কৌশল বাস্তবায়নের ক্ষমতা দেয় এবং আপনাকে আপনার আন্তর্জাতিক ব্যবহারকারী বেসের জন্য আরও স্থিতিস্থাপক অ্যাপ্লিকেশন তৈরি করতে সহায়তা করার জন্য ব্যবহারিক উদাহরণ সরবরাহ করে।
কেন টাইপস্ক্রিপ্টে রানটাইম টাইপ চেকিং গুরুত্বপূর্ণ
টাইপস্ক্রিপ্টের স্ট্যাটিক টাইপিং একটি শক্তিশালী সরঞ্জাম। এটি আমাদের প্রত্যাশিত ডেটা স্ট্রাকচার এবং প্রকারগুলি সংজ্ঞায়িত করতে দেয় এবং বিকাশকালে কম্পাইলার ত্রুটিগুলি চিহ্নিত করবে। তবে, টাইপস্ক্রিপ্টের ধরণের তথ্য প্রাথমিকভাবে জাভাস্ক্রিপ্টে সংকলন প্রক্রিয়া চলাকালীন মুছে ফেলা হয়। এর অর্থ হ'ল একবার আপনার কোডটি চললে, জাভাস্ক্রিপ্ট ইঞ্জিনের আপনার সংজ্ঞায়িত টাইপস্ক্রিপ্ট প্রকারগুলির কোনও অন্তর্নিহিত জ্ঞান নেই।
এই পরিস্থিতিগুলি বিবেচনা করুন যেখানে রানটাইম বৈধতা প্রয়োজনীয় হয়ে ওঠে:
- API প্রতিক্রিয়া: বাহ্যিক API থেকে প্রাপ্ত ডেটা, এমনকি ডকুমেন্টেড স্কিমাগুলির সাথেও, অপ্রত্যাশিত সমস্যা, API সরবরাহকারীর বাস্তবায়নের পরিবর্তন বা নেটওয়ার্ক ত্রুটির কারণে মাঝে মাঝে প্রত্যাশা থেকে বিচ্যুত হতে পারে।
- ব্যবহারকারীর ইনপুট: ফর্ম এবং ব্যবহারকারী ইন্টারফেসগুলি ডেটা সংগ্রহের আগে বৈধতা প্রয়োজন এমন ডেটা সংগ্রহ করে, এটি নিশ্চিত করে যে কেবল বৈধ এবং প্রত্যাশিত ফর্ম্যাটগুলি গ্রহণ করা হয়েছে। এটি আন্তর্জাতিক অ্যাপ্লিকেশনগুলির জন্য অত্যন্ত গুরুত্বপূর্ণ যেখানে ইনপুট ফর্ম্যাটগুলি (যেমন ফোন নম্বর বা তারিখ) উল্লেখযোগ্যভাবে পরিবর্তিত হতে পারে।
- কনফিগারেশন ফাইল: অ্যাপ্লিকেশনগুলি প্রায়শই কনফিগারেশন ফাইলের উপর নির্ভর করে (যেমন JSON, YAML)। স্টার্টআপে এই ফাইলগুলি বৈধ করা নিশ্চিত করে যে অ্যাপ্লিকেশনটি সঠিকভাবে কনফিগার করা হয়েছে, ক্র্যাশ বা খারাপ আচরণ প্রতিরোধ করে।
- অবিশ্বস্ত উত্স থেকে ডেটা: সম্ভাব্য অবিশ্বস্ত উত্স থেকে উদ্ভূত ডেটার সাথে ইন্টারঅ্যাক্ট করার সময়, ইনজেকশন আক্রমণ বা ডেটা দুর্নীতি রোধ করার জন্য পুঙ্খানুপুঙ্খ বৈধতা একটি সুরক্ষা ব্যবস্থা।
- ক্রস-এনভায়রনমেন্ট ধারাবাহিকতা: বিভিন্ন জাভাস্ক্রিপ্ট রানটাইম (Node.js, ব্রাউজার) জুড়ে এবং সিরিয়ালাইজেশন/ডিসিরিয়ালাইজেশন (যেমন JSON.parse/stringify) এর সময় ডেটা স্ট্রাকচারগুলি সামঞ্জস্যপূর্ণ থাকে তা নিশ্চিত করা অত্যাবশ্যক।
রানটাইম বৈধতা ছাড়াই, আপনার অ্যাপ্লিকেশন অপ্রত্যাশিত ডেটার সম্মুখীন হতে পারে, যার ফলে রানটাইম ত্রুটি, ডেটা দুর্নীতি, সুরক্ষা দুর্বলতা এবং একটি দুর্বল ব্যবহারকারীর অভিজ্ঞতা হতে পারে। এটি বিশেষত একটি বিশ্বব্যাপী প্রেক্ষাপটে সমস্যাযুক্ত, যেখানে ডেটা বিভিন্ন সিস্টেম থেকে উদ্ভূত হতে পারে এবং বিভিন্ন আঞ্চলিক মান মেনে চলতে পারে।
টাইপস্ক্রিপ্ট রানটাইম বৈধতার জন্য মূল লাইব্রেরি
ভাগ্যক্রমে, টাইপস্ক্রিপ্ট ইকোসিস্টেম বিশেষভাবে রানটাইম টাইপ চেকিং এবং ডেটা বৈধতার জন্য ডিজাইন করা বেশ কয়েকটি দুর্দান্ত লাইব্রেরি সরবরাহ করে। এই লাইব্রেরিগুলি আপনাকে আপনার প্রত্যাশিত ডেটা স্ট্রাকচারগুলি বর্ণনা করে এমন স্কিমাগুলি সংজ্ঞায়িত করতে এবং তারপরে আগত ডেটা যাচাই করতে এই স্কিমাগুলি ব্যবহার করতে দেয়।
আমরা সর্বাধিক জনপ্রিয় এবং কার্যকর কিছু লাইব্রেরি অন্বেষণ করব:
1. Zod
Zod তার স্বজ্ঞাত API, শক্তিশালী টাইপস্ক্রিপ্ট ইন্টিগ্রেশন এবং বিস্তৃত বৈশিষ্ট্য সেটের জন্য দ্রুত জনপ্রিয়তা অর্জন করেছে। এটি আপনাকে আপনার ডেটার জন্য একটি "স্কিমা" সংজ্ঞায়িত করতে এবং তারপরে রানটাইমে ডেটা পার্স এবং যাচাই করতে সেই স্কিমাটি ব্যবহার করতে দেয়। Zod এর স্কিমাগুলি দৃ strongly ়ভাবে টাইপ করা হয়, যার অর্থ টাইপস্ক্রিপ্ট প্রকারগুলি সরাসরি স্কিমা সংজ্ঞা থেকে অনুমান করা যেতে পারে, ম্যানুয়াল প্রকারের টীকাগুলির প্রয়োজনীয়তা হ্রাস করে।
Zod এর মূল বৈশিষ্ট্য:
- ইনফারেন্সিয়াল টাইপিং: সরাসরি Zod স্কিমা থেকে টাইপস্ক্রিপ্ট প্রকারগুলি অনুমান করুন।
- ঘোষণামূলক স্কিমা সংজ্ঞা: একটি পরিষ্কার এবং পঠনযোগ্য পদ্ধতিতে নেস্টেড অবজেক্ট, অ্যারে, ইউনিয়ন, ইন্টারসেকশন এবং কাস্টম প্রকার সহ জটিল ডেটা স্ট্রাকচারগুলি সংজ্ঞায়িত করুন।
- শক্তিশালী রূপান্তর: পার্সিংয়ের সময় ডেটা রূপান্তর করুন (যেমন স্ট্রিং থেকে সংখ্যা, তারিখ পার্সিং)।
- বিস্তৃত ত্রুটি রিপোর্টিং: ডিবাগিংয়ের জন্য গুরুত্বপূর্ণ এবং বিশ্বব্যাপী ব্যবহারকারীদের প্রতিক্রিয়া সরবরাহ করার জন্য বিস্তারিত এবং ব্যবহারকারী-বান্ধব ত্রুটি বার্তা সরবরাহ করে।
- বিল্ট-ইন ভ্যালিডেটর: স্ট্রিং, সংখ্যা, বুলিয়ান, তারিখ এবং আরও অনেক কিছুর জন্য বিল্ট-ইন ভ্যালিডেটরগুলির বিস্তৃত পরিসীমা সরবরাহ করে, পাশাপাশি কাস্টম ভ্যালিডেটর তৈরি করার ক্ষমতা রাখে।
- চেইনযোগ্য API: স্কিমাগুলি সহজেই সংমিশ্রণযোগ্য এবং প্রসারিতযোগ্য।
উদাহরণ: Zod এর সাথে একটি ব্যবহারকারীর প্রোফাইল যাচাই করা
ধরা যাক আমরা একটি API থেকে ব্যবহারকারীর প্রোফাইল ডেটা পাচ্ছি। আমরা নিশ্চিত করতে চাই যে ব্যবহারকারীর একটি বৈধ নাম, একটি ঐচ্ছিক বয়স এবং আগ্রহের একটি তালিকা রয়েছে।
import { z } from 'zod';
// Define the schema for a User Profile
const UserProfileSchema = z.object({
name: z.string().min(1, "Name cannot be empty."), // Name is a required string, at least 1 character
age: z.number().int().positive().optional(), // Age is an optional positive integer
interests: z.array(z.string()).min(1, "At least one interest is required."), // Interests is an array of strings, at least one item
isActive: z.boolean().default(true) // isActive is a boolean, defaults to true if not provided
});
// Infer the TypeScript type from the schema
type UserProfile = z.infer<typeof UserProfileSchema>;
// Example API response data
const apiResponse1 = {
name: "Alice",
age: 30,
interests: ["coding", "travel"],
isActive: false
};
const apiResponse2 = {
name: "Bob",
// age is missing
interests: [] // empty interests array
};
// --- Validation Example 1 ---
try {
const validatedProfile1 = UserProfileSchema.parse(apiResponse1);
console.log('Profile 1 is valid:', validatedProfile1);
// TypeScript now knows validatedProfile1 has the type UserProfile
} catch (error) {
if (error instanceof z.ZodError) {
console.error('Validation errors for Profile 1:', error.errors);
} else {
console.error('An unexpected error occurred:', error);
}
}
// --- Validation Example 2 ---
try {
const validatedProfile2 = UserProfileSchema.parse(apiResponse2);
console.log('Profile 2 is valid:', validatedProfile2);
} catch (error) {
if (error instanceof z.ZodError) {
console.error('Validation errors for Profile 2:', error.errors);
/*
Expected output for errors:
[
{ code: 'array_min_size', message: 'At least one interest is required.', path: [ 'interests' ] }
]
*/
} else {
console.error('An unexpected error occurred:', error);
}
}
// --- Example with optional property behavior ---
const apiResponse3 = {
name: "Charlie",
interests: ["reading"]
// isActive is omitted, will default to true
};
try {
const validatedProfile3 = UserProfileSchema.parse(apiResponse3);
console.log('Profile 3 is valid (isActive defaults to true):', validatedProfile3);
/*
Expected output: {
name: 'Charlie',
interests: [ 'reading' ],
isActive: true
}
*/
} catch (error) {
console.error('Validation errors for Profile 3:', error);
}
Zod এর ত্রুটি রিপোর্টিং আন্তর্জাতিক অ্যাপ্লিকেশনগুলির জন্য বিশেষভাবে দরকারী, কারণ আপনি ব্যবহারকারীর লোকেল ভিত্তিক ত্রুটি বার্তাগুলি নিজেরাই আন্তর্জাতিকীকরণ করতে পারেন, যদিও লাইব্রেরি নিজেই কাঠামোগত ত্রুটি ডেটা সরবরাহ করে যা এই প্রক্রিয়াটিকে সরল করে তোলে।
2. Yup
Yup জাভাস্ক্রিপ্ট এবং টাইপস্ক্রিপ্টের জন্য আরেকটি অত্যন্ত জনপ্রিয় এবং পরিপক্ক বৈধতা লাইব্রেরি। এটি প্রায়শই ফর্ম বৈধকরণের জন্য ফর্মিকের সাথে ব্যবহৃত হয় তবে এটি সাধারণ-উদ্দেশ্য ডেটা বৈধকরণের জন্য সমানভাবে শক্তিশালী। Yup স্কিমাগুলি সংজ্ঞায়িত করতে একটি সাবলীল API ব্যবহার করে, যা পরে জাভাস্ক্রিপ্ট অবজেক্টগুলিকে যাচাই করতে ব্যবহৃত হয়।
Yup এর মূল বৈশিষ্ট্য:
- স্কিমা-ভিত্তিক বৈধতা: একটি চেইনযোগ্য, ঘোষণামূলক সিনট্যাক্স ব্যবহার করে ডেটা স্কিমাগুলি সংজ্ঞায়িত করুন।
- টাইপ ইনফারেন্স: টাইপস্ক্রিপ্ট প্রকারগুলি অনুমান করতে পারে, যদিও কিছু ক্ষেত্রে জোডের তুলনায় আরও স্পষ্ট প্রকারের সংজ্ঞা প্রয়োজন হতে পারে।
- সমৃদ্ধ ভ্যালিডেটর সেট: স্ট্রিং, সংখ্যা, তারিখ, অ্যারে, অবজেক্ট এবং আরও অনেক কিছু সহ বিভিন্ন ডেটা প্রকারের জন্য বৈধতা সমর্থন করে।
- শর্তসাপেক্ষ বৈধতা: বৈধতার নিয়মগুলির অনুমতি দেয় যা অন্যান্য ক্ষেত্রগুলির মানের উপর নির্ভর করে।
- কাস্টমাইজযোগ্য ত্রুটি বার্তা: বৈধতা ব্যর্থতার জন্য সহজেই কাস্টম ত্রুটি বার্তা সংজ্ঞায়িত করুন।
- ক্রস-প্ল্যাটফর্ম সামঞ্জস্য: Node.js এবং ব্রাউজার পরিবেশে নির্বিঘ্নে কাজ করে।
উদাহরণ: Yup এর সাথে একটি পণ্য ক্যাটালগ এন্ট্রি যাচাই করা
আসুন একটি পণ্য এন্ট্রি যাচাই করি, এটি নিশ্চিত করে যে এটির একটি নাম, মূল্য এবং একটি ঐচ্ছিক বিবরণ রয়েছে।
import * as yup from 'yup';
// Define the schema for a Product Entry
const ProductSchema = yup.object({
name: yup.string().required('Product name is required.'),
price: yup.number().positive('Price must be a positive number.').required('Price is required.'),
description: yup.string().optional('Description is optional.'),
tags: yup.array(yup.string()).default([]), // Default to an empty array if not provided
releaseDate: yup.date().optional()
});
// Infer the TypeScript type from the schema
type Product = yup.InferType<typeof ProductSchema>;
// Example product data
const productData1 = {
name: "Global Gadget",
price: 199.99,
tags: ["electronics", "new arrival"],
releaseDate: new Date('2023-10-27T10:00:00Z')
};
const productData2 = {
name: "Budget Widget",
price: -10.50 // Invalid price
};
// --- Validation Example 1 ---
ProductSchema.validate(productData1, { abortEarly: false })
.then(function (validProduct: Product) {
console.log('Product 1 is valid:', validProduct);
// TypeScript knows validProduct is of type Product
})
.catch(function (err: yup.ValidationError) {
console.error('Validation errors for Product 1:', err.errors);
});
// --- Validation Example 2 ---
ProductSchema.validate(productData2, { abortEarly: false })
.then(function (validProduct: Product) {
console.log('Product 2 is valid:', validProduct);
})
.catch(function (err: yup.ValidationError) {
console.error('Validation errors for Product 2:', err.errors);
/*
Expected output for errors:
[
'Price must be a positive number.'
]
*/
});
// --- Example with default value behavior ---
const productData3 = {
name: "Simple Item",
price: 5.00
// tags and releaseDate are omitted
};
ProductSchema.validate(productData3, { abortEarly: false })
.then(function (validProduct: Product) {
console.log('Product 3 is valid (tags default to []):', validProduct);
/*
Expected output: {
name: 'Simple Item',
price: 5,
tags: [],
releaseDate: undefined
}
*/
})
.catch(function (err: yup.ValidationError) {
console.error('Validation errors for Product 3:', err.errors);
});
Yup এর বিস্তৃত ডকুমেন্টেশন এবং বৃহত সম্প্রদায় এটিকে একটি নির্ভরযোগ্য পছন্দ করে তোলে, বিশেষত বিদ্যমান Yup ব্যবহার বা ত্রুটি রিপোর্টিং এবং জটিল বৈধতা প্রবাহের উপর সূক্ষ্ম-দানাযুক্ত নিয়ন্ত্রণের প্রয়োজনযুক্ত প্রকল্পগুলির জন্য।
3. io-ts
io-ts একটি লাইব্রেরি যা কার্যকরী প্রোগ্রামিং পদ্ধতি ব্যবহার করে টাইপস্ক্রিপ্টে রানটাইম টাইপ বৈধতা নিয়ে আসে। এটি "কোডেক" সংজ্ঞায়িত করে যা ডেটা এনকোড এবং ডিকোড করতে ব্যবহৃত হয়, এটি নিশ্চিত করে যে রানটাইমে ডেটা একটি নির্দিষ্ট ধরণের সাথে সঙ্গতিপূর্ণ। এই লাইব্রেরিটি তার কঠোরতা এবং কার্যকরী নীতিগুলির দৃ strong ় আনুগত্যের জন্য পরিচিত।
io-ts এর মূল বৈশিষ্ট্য:
- কোডেক-ভিত্তিক: প্রকারগুলি সংজ্ঞায়িত এবং যাচাই করতে কোডেক ব্যবহার করে।
- কার্যকরী প্রোগ্রামিং দৃষ্টান্ত: কার্যকরী প্রোগ্রামিং শৈলীর সাথে ভালভাবে সারিবদ্ধ করে।
- রানটাইম টাইপ সুরক্ষা: রানটাইমে গ্যারান্টিযুক্ত প্রকারের সুরক্ষা সরবরাহ করে।
- প্রসারিতযোগ্য: কাস্টম কোডেক তৈরির অনুমতি দেয়।
- বিস্তৃত বৈশিষ্ট্য সেট: ইউনিয়ন প্রকার, ইন্টারসেকশন প্রকার, পুনরাবৃত্ত প্রকার এবং আরও অনেক কিছু সমর্থন করে।
- কম্প্যানিয়ন লাইব্রেরি: সহজ প্রতিশ্রুতি একীকরণের জন্য
io-ts-promiseএবং আরও ভাল ত্রুটি রিপোর্টিংয়ের জন্যio-ts-reportersএর মতো সহযোগী লাইব্রেরি রয়েছে।
উদাহরণ: io-ts এর সাথে একটি জিওলোকেশন পয়েন্ট যাচাই করা
ভূ ভৌগোলিক স্থানাঙ্কগুলি যাচাই করা একটি সাধারণ কাজ, বিশেষত অবস্থান-সচেতন গ্লোবাল অ্যাপ্লিকেশনগুলির জন্য।
import * as t from 'io-ts';
import { formatValidationErrors } from 'io-ts-reporters'; // For better error reporting
// Define the codec for a Geolocation Point
const GeolocationPoint = t.type({
latitude: t.number,
longitude: t.number,
accuracy: t.union([t.number, t.undefined]) // accuracy is optional
});
// Infer the TypeScript type from the codec
type Geolocation = t.TypeOf<typeof GeolocationPoint>;
// Example geolocation data
const geoData1 = {
latitude: 34.0522,
longitude: -118.2437,
accuracy: 10.5
};
const geoData2 = {
latitude: 'not a number',
longitude: -0.1278
};
// --- Validation Example 1 ---
const result1 = GeolocationPoint.decode(geoData1);
if (result1._tag === 'Right') {
const validatedGeo1: Geolocation = result1.right;
console.log('Geolocation 1 is valid:', validatedGeo1);
} else {
// result1._tag === 'Left'
console.error('Validation errors for Geolocation 1:', formatValidationErrors(result1.left));
}
// --- Validation Example 2 ---
const result2 = GeolocationPoint.decode(geoData2);
if (result2._tag === 'Right') {
const validatedGeo2: Geolocation = result2.right;
console.log('Geolocation 2 is valid:', validatedGeo2);
} else {
// result2._tag === 'Left'
console.error('Validation errors for Geolocation 2:', formatValidationErrors(result2.left));
/*
Expected output for errors (using io-ts-reporters):
- latitude: Expected number but received String
*/
}
// --- Example with optional property behavior ---
const geoData3 = {
latitude: 51.5074, // London
longitude: -0.1278
// accuracy is omitted
};
const result3 = GeolocationPoint.decode(geoData3);
if (result3._tag === 'Right') {
const validatedGeo3: Geolocation = result3.right;
console.log('Geolocation 3 is valid (accuracy is undefined):', validatedGeo3);
/*
Expected output: {
latitude: 51.5074,
longitude: -0.1278,
accuracy: undefined
}
*/
} else {
console.error('Validation errors for Geolocation 3:', formatValidationErrors(result3.left));
}
io-ts হ'ল এমন প্রকল্পগুলির জন্য একটি শক্তিশালী পছন্দ যা কার্যকরী প্রোগ্রামিং নীতিগুলি গ্রহণ করে এবং রানটাইম টাইপ সুরক্ষায় উচ্চ ডিগ্রি আত্মবিশ্বাসের প্রয়োজন হয়। এর বিস্তারিত ত্রুটি রিপোর্টিং, বিশেষত যখন io-ts-reporters এর সাথে যুক্ত করা হয়, আন্তর্জাতিক অ্যাপ্লিকেশনগুলির ডিবাগিংয়ের জন্য অমূল্য।
4. class-validator
class-validator এবং এর সহযোগী class-transformer এমন পরিস্থিতিতে দুর্দান্ত যেখানে আপনি ক্লাসগুলির সাথে কাজ করছেন, বিশেষত নেস্টজেএস এর মতো ফ্রেমওয়ার্কগুলিতে। এটি আপনাকে সরাসরি শ্রেণীর বৈশিষ্ট্যগুলিতে ডেকোরেটর ব্যবহার করে বৈধতার নিয়ম সংজ্ঞায়িত করতে দেয়।
class-validator এর মূল বৈশিষ্ট্য:
- ডেকোরেটর-ভিত্তিক বৈধতা: শ্রেণীর বৈশিষ্ট্যগুলিতে ডেকোরেটর ব্যবহার করুন (যেমন
@IsEmail(),@IsNotEmpty())। - ক্লাস-ট্রান্সফরমার ইন্টিগ্রেশন: বৈধকরণের আগে আগত ডেটা নির্বিঘ্নে শ্রেণীর উদাহরণগুলিতে রূপান্তর করুন।
- প্রসারিতযোগ্য: কাস্টম বৈধতা ডেকোরেটর তৈরি করুন।
- বিল্ট-ইন ভ্যালিডেটর: সাধারণ বৈধতার প্রয়োজনের জন্য ডেকোরেটরগুলির বিস্তৃত অ্যারে।
- ত্রুটি পরিচালনা: বিস্তারিত বৈধতা ত্রুটি অবজেক্ট সরবরাহ করে।
উদাহরণ: class-validator এর সাথে একটি ইমেল রেজিস্ট্রেশন ফর্ম যাচাই করা
এটি বিশ্বজুড়ে ব্যবহারকারীর সাইন-আপগুলি পরিচালনা করে এমন ব্যাকএন্ড APIগুলির জন্য বিশেষভাবে দরকারী।
import 'reflect-metadata'; // Required for decorators
import { validate, Contains, IsInt, Length, IsEmail, IsOptional } from 'class-validator';
import { plainToClass, classToPlain } from 'class-transformer';
// Define the DTO (Data Transfer Object) with validation decorators
class UserRegistrationDto {
@Length(5, 50, { message: 'Username must be between 5 and 50 characters.' })
username: string;
@IsEmail({}, { message: 'Invalid email address format.' })
email: string;
@IsInt({ message: 'Age must be an integer.' })
@IsOptional() // Age is optional
age?: number;
constructor(username: string, email: string, age?: number) {
this.username = username;
this.email = email;
this.age = age;
}
}
// Example incoming data (e.g., from an API request body)
const registrationData1 = {
username: "global_user",
email: "user@example.com",
age: 25
};
const registrationData2 = {
username: "short", // Too short username
email: "invalid-email", // Invalid email
age: 30.5 // Not an integer
};
// --- Validation Example 1 ---
// First, transform plain object into a class instance
const userDto1 = plainToClass(UserRegistrationDto, registrationData1);
validate(userDto1).then(errors => {
if (errors.length > 0) {
console.error('Validation errors for Registration 1:', errors);
} else {
console.log('Registration 1 is valid:', classToPlain(userDto1)); // Convert back to plain object for output
}
});
// --- Validation Example 2 ---
const userDto2 = plainToClass(UserRegistrationDto, registrationData2);
validate(userDto2).then(errors => {
if (errors.length > 0) {
console.error('Validation errors for Registration 2:', errors.map(err => err.constraints));
/*
Expected output for errors.constraints:
[ {
length: 'Username must be between 5 and 50 characters.',
isEmail: 'Invalid email address format.',
isInt: 'Age must be an integer.'
} ]
*/
} else {
console.log('Registration 2 is valid:', classToPlain(userDto2));
}
});
// --- Example with optional property behavior ---
const registrationData3 = {
username: "validUser",
email: "valid@example.com"
// age is omitted, which is allowed by @IsOptional()
};
const userDto3 = plainToClass(UserRegistrationDto, registrationData3);
validate(userDto3).then(errors => {
if (errors.length > 0) {
console.error('Validation errors for Registration 3:', errors);
} else {
console.log('Registration 3 is valid (age is undefined):', classToPlain(userDto3));
/*
Expected output: {
username: 'validUser',
email: 'valid@example.com',
age: undefined
}
*/
}
});
class-validator সার্ভার-সাইড অ্যাপ্লিকেশন বা ফ্রেমওয়ার্কগুলিতে বিশেষভাবে কার্যকর যা শ্রেণি এবং অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের উপর প্রচুর নির্ভর করে। এর ডেকোরেটর-ভিত্তিক সিনট্যাক্স খুব অভিব্যক্তিপূর্ণ এবং বিকাশকারী-বান্ধব।
সঠিক বৈধতা লাইব্রেরি নির্বাচন করা
আপনার প্রকল্পের জন্য সেরা বৈধতা লাইব্রেরি বেশ কয়েকটি কারণের উপর নির্ভর করে:
- প্রকল্প দৃষ্টান্ত: আপনি যদি কার্যকরী প্রোগ্রামিংয়ে প্রচুর পরিমাণে থাকেন তবে
io-tsআপনার গো-টু হতে পারে। অবজেক্ট-ওরিয়েন্টেড পদ্ধতির জন্য,class-validatorউজ্জ্বল। আরও সাধারণ-উদ্দেশ্য, ঘোষণামূলক পদ্ধতির জন্য চমৎকার টাইপস্ক্রিপ্ট অনুমানের সাথে,Zodএকটি শক্তিশালী প্রতিযোগী।Yupঅনেক পরিস্থিতিতে উপযুক্ত একটি পরিপক্ক এবং নমনীয় API সরবরাহ করে। - টাইপস্ক্রিপ্ট ইন্টিগ্রেশন: স্কিমা থেকে সরাসরি নির্বিঘ্ন টাইপস্ক্রিপ্ট টাইপ অনুমানের ক্ষেত্রে
Zodনেতৃত্ব দেয়। অন্যরা ভাল ইন্টিগ্রেশন সরবরাহ করে তবে আরও স্পষ্ট প্রকারের সংজ্ঞা প্রয়োজন হতে পারে। - শেখার বক্ররেখা:
ZodএবংYupসাধারণত নতুনদের জন্য শুরু করা সহজ হিসাবে বিবেচিত হয়।io-tsএর কার্যকরী প্রকৃতির কারণে একটি খাড়া শিক্ষার বক্ররেখা রয়েছে। আপনি যদি ডেকোরেটরের সাথে স্বাচ্ছন্দ্যবোধ করেন তবেclass-validatorসোজা। - ইকোসিস্টেম এবং সম্প্রদায়:
YupএবংZodএর বৃহত এবং সক্রিয় সম্প্রদায় রয়েছে, যা প্রচুর সংস্থান এবং সহায়তা সরবরাহ করে। - নির্দিষ্ট বৈশিষ্ট্য: আপনার যদি জটিল রূপান্তর (
Zod), ফর্ম ইন্টিগ্রেশন (Yup), বা ডেকোরেটর-ভিত্তিক বৈধতা (class-validator) এর মতো নির্দিষ্ট বৈশিষ্ট্যগুলির প্রয়োজন হয় তবে এটি আপনার সিদ্ধান্তকে প্রভাবিত করতে পারে।
অনেক আধুনিক টাইপস্ক্রিপ্ট প্রকল্পের জন্য, Zod প্রায়শই তার চমৎকার প্রকারের অনুমান, স্বজ্ঞাত API এবং শক্তিশালী বৈশিষ্ট্যগুলির কারণে একটি মিষ্টি স্পট হিট করে। তবে, অন্যান্য লাইব্রেরিগুলির শক্তি উপেক্ষা করবেন না।
রানটাইম বৈধতার জন্য সেরা অনুশীলন
কার্যকরভাবে রানটাইম বৈধতা বাস্তবায়নের জন্য কেবল একটি লাইব্রেরি নির্বাচন করার চেয়ে বেশি প্রয়োজন। অনুসরণ করার জন্য এখানে কিছু সেরা অনুশীলন রয়েছে:
1. তাড়াতাড়ি যাচাই করুন, প্রায়শই যাচাই করুন
আপনি যত তাড়াতাড়ি ডেটা যাচাই করবেন, তত তাড়াতাড়ি আপনি ত্রুটিগুলি ধরতে পারবেন। এই নীতিটি প্রায়শই "দ্রুত ব্যর্থ" হিসাবে সংক্ষিপ্ত করা হয়। ডেটা আপনার সিস্টেমে প্রবেশ করার সাথে সাথেই এটি যাচাই করুন, তা API অনুরোধ, ব্যবহারকারীর ইনপুট বা কনফিগারেশন ফাইল থেকেই হোক না কেন।
2. বৈধতা লজিক কেন্দ্রীভূত করুন
আপনার কোডবেস জুড়ে বৈধতা লজিক ছড়িয়ে দেওয়া এড়িয়ে চলুন। ডেডিকেটেড মডিউল বা ক্লাসগুলিতে আপনার স্কিমা বা বৈধতার নিয়ম সংজ্ঞায়িত করুন। এটি আপনার কোডটিকে আরও সংগঠিত, রক্ষণাবেক্ষণ করা সহজ করে তোলে এবং সদৃশ হ্রাস করে।
3. বর্ণনামূলক ত্রুটি বার্তা ব্যবহার করুন
বৈধতা ত্রুটিগুলি তথ্যমূলক হওয়া উচিত। আন্তর্জাতিক অ্যাপ্লিকেশনগুলির জন্য, এর অর্থ ত্রুটি বার্তাগুলি হওয়া উচিত:
- স্পষ্ট এবং সংক্ষিপ্ত: তাদের প্রযুক্তিগত পটভূমি নির্বিশেষে ব্যবহারকারীদের দ্বারা সহজেই বোধগম্য।
- কার্যকরযোগ্য: কীভাবে ইনপুট সংশোধন করতে হবে সে সম্পর্কে ব্যবহারকারীকে গাইড করুন।
- স্থানীয়করণযোগ্য: ব্যবহারকারীর লোকেল ভিত্তিক ত্রুটি বার্তাগুলির অনুবাদ করার অনুমতি দেওয়ার জন্য আপনার সিস্টেমটি ডিজাইন করুন। বৈধতা লাইব্রেরি দ্বারা সরবরাহিত কাঠামোগত ত্রুটিগুলি এটি সক্ষম করার মূল চাবিকাঠি।
উদাহরণস্বরূপ, কেবল "অবৈধ ইনপুট" এর পরিবর্তে, "অনুগ্রহ করে example@domain.com বিন্যাসে একটি বৈধ ইমেল ঠিকানা প্রবেশ করুন।" আন্তর্জাতিক ব্যবহারকারীদের জন্য, এটি তাদের ভাষা এবং আঞ্চলিক ইমেল সম্মেলনে স্থানীয়করণ করা যেতে পারে।
4. আপনার টাইপস্ক্রিপ্ট প্রকারের সাথে মেলে এমন স্কিমা সংজ্ঞায়িত করুন
আপনার টাইপস্ক্রিপ্ট প্রকার এবং আপনার রানটাইম বৈধতা স্কিমাগুলির মধ্যে ধারাবাহিকতার জন্য চেষ্টা করুন। জোডের মতো লাইব্রেরি স্কিমা থেকে প্রকারগুলি অনুমান করতে পারদর্শী, যা আদর্শ পরিস্থিতি। আপনি যদি ম্যানুয়ালি প্রকার এবং স্কিমাগুলি পৃথকভাবে সংজ্ঞায়িত করেন তবে অমিল এড়াতে সেগুলি সিঙ্ক্রোনাইজড রয়েছে তা নিশ্চিত করুন।
5. বৈধতা ত্রুটিগুলি সুন্দরভাবে পরিচালনা করুন
বৈধতা ত্রুটিগুলি আপনার অ্যাপ্লিকেশন ক্র্যাশ করতে দেবেন না। শক্তিশালী ত্রুটি পরিচালনা বাস্তবায়ন করুন। API এন্ডপয়েন্টগুলির জন্য, উপযুক্ত HTTP স্থিতি কোডগুলি ফেরত দিন (যেমন, 400 খারাপ অনুরোধ) এবং ত্রুটিগুলি বিস্তারিতভাবে একটি কাঠামোগত JSON প্রতিক্রিয়া। ব্যবহারকারী ইন্টারফেসগুলির জন্য, প্রাসঙ্গিক ফর্ম ক্ষেত্রগুলির পাশে স্পষ্ট ত্রুটি বার্তা প্রদর্শন করুন।
6. বিভিন্ন স্তরে বৈধতা বিবেচনা করুন
ক্লায়েন্ট-সাইড বৈধতা ব্যবহারকারীদের তাৎক্ষণিক প্রতিক্রিয়া সরবরাহ করে, ব্যবহারকারীর অভিজ্ঞতা উন্নত করে। তবে, এটি সুরক্ষিত নয় কারণ এটি বাইপাস করা যেতে পারে। সার্ভার-সাইড বৈধতা ডেটার অখণ্ডতা এবং সুরক্ষার জন্য প্রয়োজনীয়, কারণ এটি প্রতিরক্ষার শেষ লাইন। ক্লায়েন্ট-সাইড বৈধতা থাকলেও সর্বদা সার্ভার-সাইড বৈধতা প্রয়োগ করুন।
7. টাইপস্ক্রিপ্টের প্রকার অনুমানকে কাজে লাগান
শক্তিশালী টাইপস্ক্রিপ্ট ইন্টিগ্রেশন সরবরাহ করে এমন লাইব্রেরি ব্যবহার করুন। এটি বয়লারপ্লেট হ্রাস করে এবং নিশ্চিত করে যে আপনার বৈধতা স্কিমা এবং টাইপস্ক্রিপ্ট প্রকারগুলি সর্বদা সিঙ্কে রয়েছে। যখন কোনও লাইব্রেরি স্কিমা থেকে প্রকারগুলি অনুমান করতে পারে (যেমন জোড), এটি একটি উল্লেখযোগ্য সুবিধা।
8. গ্লোবাল বিবেচনা: টাইমজোন, মুদ্রা এবং বিন্যাস
একটি গ্লোবাল দর্শকদের জন্য তৈরি করার সময়, বৈধতার নিয়মগুলিতে আঞ্চলিক পার্থক্যগুলি সামঞ্জস্য করতে হবে:
- তারিখ এবং সময়: প্রত্যাশিত বিন্যাস অনুসারে তারিখ এবং সময়গুলি যাচাই করুন (যেমন, DD/MM/YYYY বনাম MM/DD/YYYY) এবং সঠিকভাবে সময় অঞ্চল রূপান্তরগুলি পরিচালনা করুন। জোডের মতো লাইব্রেরিগুলিতে অন্তর্নির্মিত তারিখ পার্সার রয়েছে যা কনফিগার করা যেতে পারে।
- মুদ্রা: মুদ্রা মানগুলি যাচাই করুন, সম্ভাব্যভাবে নির্দিষ্ট নির্ভুলতার প্রয়োজনীয়তা বা মুদ্রা কোড সহ।
- ফোন নম্বর: দেশ কোড এবং বিভিন্ন বিন্যাস বিবেচনা করে আন্তর্জাতিক ফোন নম্বরগুলির জন্য শক্তিশালী বৈধতা প্রয়োগ করুন।
libphonenumber-jsএর মতো লাইব্রেরিগুলি বৈধতা স্কিমাগুলির সাথে একত্রে ব্যবহার করা যেতে পারে। - ঠিকানা: ঠিকানা উপাদানগুলির বৈধতা কাঠামো এবং প্রয়োজনীয় ক্ষেত্রগুলিতে উল্লেখযোগ্য আন্তর্জাতিক বৈচিত্রের কারণে জটিল হতে পারে।
আপনার বৈধতা স্কিমাগুলি এই বৈচিত্রগুলি পরিচালনা করার জন্য যথেষ্ট নমনীয় হওয়া উচিত বা আপনি যে লক্ষ্য বাজারগুলিতে পরিবেশন করছেন তার জন্য যথেষ্ট নির্দিষ্ট হওয়া উচিত।
উপসংহার
যদিও টাইপস্ক্রিপ্টের কম্পাইল-টাইম চেকিং আধুনিক ওয়েব বিকাশের একটি ভিত্তি, রানটাইম টাইপ চেকিং শক্তিশালী, সুরক্ষিত এবং রক্ষণাবেক্ষণযোগ্য অ্যাপ্লিকেশন তৈরির জন্য সমানভাবে গুরুত্বপূর্ণ উপাদান, বিশেষত একটি বিশ্বব্যাপী প্রেক্ষাপটে। জোড, ইয়ুপ, আইও-টিএস এবং ক্লাস-ভ্যালিডেটর এর মতো শক্তিশালী লাইব্রেরিগুলিকে কাজে লাগিয়ে আপনি ডেটার অখণ্ডতা নিশ্চিত করতে পারেন, অপ্রত্যাশিত ত্রুটিগুলি প্রতিরোধ করতে পারেন এবং বিশ্বব্যাপী ব্যবহারকারীদের জন্য আরও নির্ভরযোগ্য অভিজ্ঞতা সরবরাহ করতে পারেন।
এই বৈধতা কৌশল এবং সেরা অনুশীলনগুলি গ্রহণ করা আরও স্থিতিস্থাপক অ্যাপ্লিকেশনগুলির দিকে পরিচালিত করবে যা বিভিন্ন ডেটা উত্স এবং বিভিন্ন অঞ্চল এবং সংস্কৃতি জুড়ে ব্যবহারকারীর মিথস্ক্রিয়াগুলির জটিলতা সহ্য করতে পারে। পুঙ্খানুপুঙ্খ বৈধতায় বিনিয়োগ করুন; এটি আপনার সফ্টওয়্যারটির গুণমান এবং বিশ্বাসযোগ্যতার একটি বিনিয়োগ।